using System;
using System.Security.Cryptography;
using System.Text;

namespace Common {
    public class MD5Encryptor {
        /// <summary>
        /// 对输入的字符串进行 MD5 加密
        /// </summary>
        /// <param name="input">待加密的字符串</param>
        /// <returns>加密后的 32 位十六进制字符串</returns>
        public static string Encrypt(string input)
        {
            using (MD5 md5Hash = MD5.Create())
            {
                // 将输入字符串转换为字节数组并计算哈希数据
                byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

                // 创建一个 StringBuilder 来收集字节并创建字符串
                StringBuilder sBuilder = new StringBuilder();

                // 遍历哈希数据的每一个字节并格式化为十六进制字符串
                for (int i = 0; i < data.Length; i++)
                {
                    sBuilder.Append(data[i].ToString("x2"));
                }

                // 返回十六进制字符串
                return sBuilder.ToString();
            }
        }

        /// <summary>
        /// 验证输入的字符串与加密后的哈希值是否匹配
        /// </summary>
        /// <param name="input">待验证的字符串</param>
        /// <param name="hash">加密后的哈希值</param>
        /// <returns>如果匹配返回 true，否则返回 false</returns>
        public static bool Verify(string input, string hash)
        {
            // 对输入的字符串进行加密
            string hashOfInput = Encrypt(input);

            // 创建 StringComparer 进行不区分大小写的比较
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            // 比较两个哈希值
            return comparer.Compare(hashOfInput, hash) == 0;
        }
    }
}